package com.suke.czx.modules.incentive.mapper;

import com.suke.czx.common.utils.FieldConstant;
import com.suke.czx.modules.incentive.entity.*;
import com.suke.czx.modules.performanceconfig.entity.PerformanceConfig;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 应用模块名称: 绩效
 * 代码描述: 绩效持久层
 * copyright: AUZAR ALL RIGHTS RESERVED
 * company: AUZAR
 *
 * @author: 颜米晨
 * @date: 2022/07/27 19:50
 */
public interface IncentiveMapper {

    /**
     * 校验绩效参数是否完整
     * @param year 年份
     * @param version 版本
     * @return 组别数据set
     */
    Set<Integer> configVerify(@Param("year") String year, @Param("version") Integer version);

    /**
     * 查询已关联绩效参数年份版本
     * @param projectId 项目id
     * @return 绩效已关联年份版本数据集
     */
    List<Map<String, Object>> related(@Param("projectId") Long projectId);

    /**
     * 查询绩效考核参数
     * @param incentiveGenerateBo 绩效考核参数查询BO
     * @return 绩效考核参数map
     */
    @MapKey(value = FieldConstant.JOB_2)
    Map<Integer, IncentiveEvaluation> getIncentiveEvaluation(IncentiveGenerateBo incentiveGenerateBo);

    /**
     * 查询是否在该项目,该年份,该版本,该组别下是否已考核绩效
     * @param projectId 项目id
     * @param year 年份
     * @param version 版本
     * @param job2 组别
     * @return 考核记录数
     */
    List<Long> getEvaluationCount(@Param("projectId") Long projectId, @Param("year") String year,
                                  @Param("version") Integer version, @Param("job2") Integer job2);

    /**
     * 新增绩效考核
     * @param incentiveEvaluation 绩效考核对象
     */
    void insertIncentiveEvaluation(IncentiveEvaluation incentiveEvaluation);

    /**
     * 更新绩效考核
     * @param incentiveEvaluation 绩效考核对象
     */
    void updateIncentiveEvaluation(IncentiveEvaluation incentiveEvaluation);

    /**
     * 查询是否员工在该项目,该组别,该绩效参数,该类目下是否已分配绩效
     * @param projectId 项目id
     * @param job2 组别
     * @param performanceConfigId 绩效参数id
     * @param userId id
     * @return 分配记录数
     */
    Integer getAllocationCount(@Param("projectId") Long projectId, @Param("job2") Integer job2, @Param("performanceConfigId") Long performanceConfigId,
                               @Param("userId") Long userId);

    /**
     * 新增绩效分配
     * @param incentiveAllocation 绩效分配实体
     */
    void insertIncentiveAllocation(IncentiveAllocation incentiveAllocation);

    /**
     * 更新绩效分配
     * @param incentiveAllocation 绩效分配实体
     */
    void updateIncentiveAllocation(IncentiveAllocation incentiveAllocation);

    /**
     * 删除绩效分配
     * @param incentiveId 绩效分配id
     * @param userId 用户id
     */
    void deleteIncentiveAllocation(@Param("incentiveId") Long incentiveId, @Param("userId") Long userId);

    /**
     * 查询生成绩效的各金额项
     * @param projectId 项目id
     * @return 生成绩效金额项实体
     */
    GenerateMoney getGenerateMoney(@Param("projectId") Long projectId);

    /**
     * 查询年份版本下所有绩效参数
     * @param year 年份
     * @param version 版本
     * @return 绩效参数map
     */
    @MapKey(value = FieldConstant.JOB_2)
    Map<Integer, PerformanceConfig> getPerformanceConfigByYearAndVersion(@Param("year") String year, @Param("version") Integer version);

    /**
     * 查询绩效分配
     * @param projectId 项目id
     * @param job2 组别
     * @param performanceConfigId 绩效参数id
     * @param grossReward 毛利奖金
     * @param fixedReward 固定提成
     * @return 绩效分配数据集
     */
    List<Incentive> getIncentiveAllocation(@Param("projectId") Long projectId, @Param("job2") Integer job2, @Param("performanceConfigId") Long performanceConfigId,
                                           @Param("grossReward") BigDecimal grossReward, @Param("fixedReward") BigDecimal fixedReward);

    /**
     * 新增绩效版本
     * @param incentiveVersion 绩效版本实体
     */
    void insertIncentiveVersion(IncentiveVersion incentiveVersion);

    /**
     * 查询已有发放记录
     * @param projectId 项目id
     * @return 发放记录数据集
     */
    List<Map<String, Object>> grantRecord(@Param("projectId") Long projectId);

    /**
     * 查询已关联版本数据集
     * @param projectId 项目id
     * @return 已关联版本数据集
     */
    List<Map<String, Object>> versionRecord(@Param("projectId") Long projectId);

}
